home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Go64!
/
Go64_2002-01_2002_CSW_Side_A.d64
/
3-d rotation.txt
< prev
next >
Wrap
Text File
|
2023-02-26
|
16KB
|
752 lines
; go64! tutorial on 3-d graphics
; part 2: rotating points
; go64! 3d-kurs
; teil 2: punkte rotieren
vicbank = %00000011; $0000-$4000
v = vicbank($03*$4000;=$0000
screen = $0400
charset = $0800
xaddlotb = $2000
xaddhitb = $2080
pixeltab = $2100
basezp = $02
pointers = $00+basezp
alpha = $02+basezp
beta = $03+basezp
gamma = $04+basezp
curcoord = $05+basezp
crd0bufl = $06+basezp
crd0bufh = $07+basezp
crd1bufl = $08+basezp
crd1bufh = $09+basezp
sinbuflo = $0a+basezp
sinbufhi = $0b+basezp
cosbuflo = $0c+basezp
cosbufhi = $0d+basezp
rotbuflo = $0e+basezp
rotbufhi = $0f+basezp
fixpaccu = $10+basezp
multzrpg = $13+basezp
dividend = $13+basezp
divisor = $15+basezp
x2dcrdfr = $18+basezp
y2dcrdfr = $20+basezp
z2dcrdfr = $28+basezp
x2dcords = $30+basezp
y2dcords = $38+basezp
z2dcords = $40+basezp
oldxcrds = $48+basezp
oldycrds = $50+basezp
foregndc = $01
backgndc = $06
xpos = $0c; matrix coordinates
ypos = $05; matrizenkoordinaten
alphaadd = $02; angle add values
betaadd = $07; winkeladditionswerte
gammaadd = $fd
*= $4000
sei
lda #$35
sta $01
lda #<return;nmi
sta $fffa
lda #>return;nmi
sta $fffb
bit $d011
bpl *-3
bit $d011
bmi *-3
lda #$00
sta $d011
lda #backgndc
sta $d020
sta $d021
; build tables
; tabellen generieren
lda #<charset+v
ldx #>charset+v
ldy #$00
.byte $24
mkxaddtb pla
sta xaddlotb,y
pha
txa
sta xaddhitb,y
iny
tya
and #%00000111
bne mkxaddtb+0
pla
clc
adc #$80
bcc *+3
inx
cpy #$80
bne mkxaddtb+1
lda #%10000000
ldx #$00
makpxltb sta pixeltab,x
tay
lsr a
tya
ror a
inx
bpl makpxltb
; clear charset
; zeichensatz loeschen
lda #<charset+v
sta pointers+0
lda #>charset+v
sta pointers+1
lda #$00
ldx #$08
tay
clearchr sta (pointers+0),y
iny
bne clearchr
inc pointers+1
dex
bne clearchr
; clear screen
; bildschirm loeschen
lda #$00
tax
sta screen+v+$00,x
sta screen+v+$0100,x
sta screen+v+$0200,x
sta screen+v+$0300,x
inx
bne *-13
; set up screen matrix
; bildschirmmatrix bilden
clc
lda #<xpos+(ypos*$28)+screen+v
sta pointers+0
lda #>xpos+(ypos*$28)+screen+v
sta pointers+1
ldx #$00
setupscr txa
ldy #$00
sta (pointers+0),y
adc #$10
iny
cpy #$10
bne setupscr+3
lda #$27
adc pointers+0
sta pointers+0
bcc *+4
inc pointers+1
inx
cpx #$10
bne setupscr
; set foreground colour
; vordergrundfarbe setzen
lda #foregndc
ldx #$00
sta $d800,x
sta $d900,x
sta $da00,x
sta $db00,x
inx
bne *-13
; set vic registers
; vic-register setzen
bit $d011
bpl *-3
bit $d011
bmi *-3
lda #%00011011
sta $d011
lda #%00001000
sta $d016
lda #screen/$40.(charset/$0400)
sta $d018
lda $dd00
and #%00000011
ora #vicbank
sta $dd00
; reset angles and coordinates
; koordinaten&winkel nullsetzen
lda #$00
ldx #numpoint-1
sta oldxcrds,x
sta oldycrds,x
dex
bpl *-5
sta alpha
sta beta
sta gamma
; main loop
; hauptschleife
mainloop ; rotate coordinates
; koordinaten rotieren
lda alpha
jsr getsines
rotatex stx curcoord; rotate around x
; um x rotieren
lda ycoords,x
sta fixpaccu+0
sta crd0bufh
lda #$00
sta fixpaccu+2
lda sinbuflo
ldx sinbufhi
jsr multiply; y * sin (alpha)
sty rotbuflo
sta rotbufhi
lda zcoords,x
sta fixpaccu+0
sta crd1bufh
lda #$00
sta fixpaccu+2
lda cosbuflo
ldx cosbufhi
jsr multiply; z * cos (alpha)
pha
tya
sec
sbc rotbuflo
sta y2dcrdfr,x
pla
sbc rotbufhi ;y'= z*cos(alpha)
sta y2dcords,x; - y*sin(alpha)
lda crd1bufh
sta fixpaccu+0
lda #$00
sta fixpaccu+2
lda sinbuflo
ldx sinbufhi
jsr multiply; z * sin (alpha)
sty rotbuflo
sta rotbufhi
lda crd0bufh
sta fixpaccu+0
lda #$00
sta fixpaccu+2
lda cosbuflo
ldx cosbufhi
jsr multiply; y * cos (alpha)
pha
tya
clc
adc rotbuflo
sta z2dcrdfr,x
pla
adc rotbufhi ;z'= y*cos(alpha)
sta z2dcords,x; + z*sin(alpha)
dex
bpl rotatex
lda beta
jsr getsines
rotatey stx curcoord; rotate around y
; um y rotieren
lda xcoords,x
sta fixpaccu+0
sta crd0bufh
lda #$00
sta fixpaccu+2
lda cosbuflo
ldx cosbufhi
jsr multiply; x * cos (beta)
sty rotbuflo
sta rotbufhi
lda z2dcords,x
sta fixpaccu+0
sta crd1bufh
lda z2dcrdfr,x
sta fixpaccu+2
sta crd1bufl
lda sinbuflo
ldx sinbufhi
jsr multiply; z' * sin (beta)
pha
tya
clc
adc rotbuflo
sta x2dcrdfr,x
pla
adc rotbufhi ;x'= z'*sin(beta)
sta x2dcords,x; + x*cos (beta)
lda crd1bufh
sta fixpaccu+0
lda crd1bufl
sta fixpaccu+2
lda cosbuflo
ldx cosbufhi
jsr multiply; z' * cos (beta)
sty rotbuflo
sta rotbufhi
lda crd0bufh
sta fixpaccu+0
lda #$00
sta fixpaccu+2
lda sinbuflo
ldx sinbufhi
jsr multiply; x * sin (beta)
pha
tya
sec
sbc rotbuflo
sta z2dcrdfr,x
pla
sbc rotbufhi ;z''=x*sin (beta)
sta z2dcords,x; -z'*cos(beta)
dex
bpl rotatey
lda gamma
jsr getsines
rotatez stx curcoord; rotate around z
; um z rotieren
lda x2dcords,x
sta fixpaccu+0
sta crd0bufh
lda x2dcrdfr,x
sta fixpaccu+2
sta crd0bufl
lda cosbuflo
ldx cosbufhi
jsr multiply; x' * cos (gamma)
sty rotbuflo
sta rotbufhi
lda y2dcords,x
sta fixpaccu+0
sta crd1bufh
lda y2dcrdfr,x
sta fixpaccu+2
sta crd1bufl
lda sinbuflo
ldx sinbufhi
jsr multiply; y' * sin (gamma)
pha
tya
clc
adc rotbuflo
sta x2dcrdfr,x
pla
adc rotbufhi; x''=y'*sin(gamma)
sta x2dcords,x; +x'*cos(gamma)
lda crd1bufh
sta fixpaccu+0
lda crd1bufl
sta fixpaccu+2
lda cosbuflo
ldx cosbufhi
jsr multiply; y' * cos (gamma)
sty rotbuflo
sta rotbufhi
lda crd0bufh
sta fixpaccu+0
lda crd0bufl
sta fixpaccu+2
lda sinbuflo
ldx sinbufhi
jsr multiply; x' * sin (gamma)
cpy rotbuflo
sbc rotbufhi ;y''=x'*sin(beta)
sta y2dcords,x; -y'*cos(beta)
dex
bpl rotatez
; convert coordinates to 2-d
; koordinaten nach 2d wandeln
ldx #numpoint-1
convto2d ldy x2dcrdfr,x
lda x2dcords,x
jsr perspect
sta x2dcords,x
ldy z2dcrdfr,x
lda z2dcords,x
jsr perspect
sta y2dcords,x
dex
bpl convto2d
; clear the old points
; die alten punkte loeschen
bit $d011
bpl *-3
bit $d011
bmi *-3
lda #numpoint-1
clrpoint pha
tax
lda oldxcrds,x
ldy oldycrds,x
tax
lda xaddlotb,x
sta pointers+0
lda xaddhitb,x
sta pointers+1
lda #$ff
eor pixeltab,x
and (pointers+0),y
sta (pointers+0),y
pla
sec
sbc #$01
bpl clrpoint
; put the rotated points
; die rotierten punkte setzen
lda #numpoint-1
putpoint pha
tax
lda x2dcords,x
sta oldxcrds,x
ldy y2dcords,x
sty oldycrds,x
tax
lda xaddlotb,x
sta pointers+0
lda xaddhitb,x
sta pointers+1
lda pixeltab,x
ora (pointers+0),y
sta (pointers+0),y
pla
sec
sbc #$01
bpl putpoint
; advance angles
; winkel erhoehen
clc
lda #alphaadd
adc alpha
sta alpha
clc
lda #betaadd
adc beta
sta beta
clc
lda #gammaadd
adc gamma
sta gamma
jmp mainloop
; get sine/cosine values
; sinus-/kosinuswerte holen
getsines tax
lda sincoslo,x
sta sinbuflo
lda sincoshi,x
sta sinbufhi
clc
txa
adc #$40
tax
lda sincoslo,x
sta cosbuflo
lda sincoshi,x
sta cosbufhi
ldx #numpoint-1
rts
; multiply with sin/cos
; mit sin/cos multiplizieren
multiply ldy #$00
sty fixpaccu+$01
sty multzrpg+1
sty multzrpg+2
cpx #$00
beq *+8
clc
eor #$ff
adc #$01
dey
sta multzrpg+0
bit fixpaccu+$00
bpl *+16
sec
lda #$00
sbc fixpaccu+$02
sta fixpaccu+$02
lda #$00
sbc fixpaccu+$00
sta fixpaccu+$00
iny
sty multzrpg+3
lda #$00
ldx #$08
tay
multloop lsr multzrpg+0
bcc nomultad
clc
lda fixpaccu+$02
adc multzrpg+1
sta multzrpg+1
tya
adc fixpaccu+$00
tay
lda fixpaccu+$01
adc multzrpg+2
sta multzrpg+2
nomultad asl fixpaccu+$02
rol fixpaccu+$00
rol fixpaccu+$01
dex
bne multloop
ldx multzrpg+3
beq nonegrsl
tax
tya
clc
eor #$ff
adc #$01
tay
txa
eor #$ff
adc #$00
nonegrsl ldx curcoord
rts
;perform perspective division
;perspektivdivision vollfuehren
perspect pha
bpl nonegcrd
pha
tya
clc
eor #$ff
adc #$01
tay
pla
eor #$ff
adc #$00
nonegcrd sta dividend+0
sty dividend+1
clc
lda #$4e; only positive depth
; values
; nur positive tiefen-
; werte
adc y2dcords,x
sta divisor+0
ldy #$00
sty divisor+1
iny
sty divisor+2
sec
divloop ror divisor+0
ror divisor+1
sec
lda dividend+1
sbc divisor+1
tay
lda dividend+0
sbc divisor+0
bcc *+6
sta dividend+0
sty dividend+1
rol divisor+2
bcc divloop
pla
asl a
lda divisor+2
bcc *+4
eor #$ff
adc #$40;origin is at ($40;$40)
;ursprung bei ($40;$40)
rts
nmi rti
; point coordinates
; punktkoordinaten
xcoords .byte $d4,$2c,$d4,$2c
.byte $d4,$2c,$d4,$2c
ycoords .byte $d4,$d4,$2c,$2c
.byte $d4,$d4,$2c,$2c
zcoords .byte $d4,$d4,$d4,$d4
.byte $2c,$2c,$2c,$2c
; sine/cosine table
; sinus-/kosinustabelle
*= *&$ff00+$0100
sincoslo .byte $00,$06,$0d,$13,$19,$1f
.byte $25,$2c,$32,$38,$3e,$44
.byte $4a,$50,$56,$5c,$62,$67
.byte $6d,$73,$78,$7e,$83,$88
.byte $8e,$93,$98,$9d,$a2,$a7
.byte $ab,$b0,$b4,$b9,$bd,$c1
.byte $c5,$c9,$cd,$d0,$d4,$d7
.byte $db,$de,$e1,$e4,$e7,$e9
.byte $ec,$ee,$f0,$f2,$f4,$f6
.byte $f7,$f9,$fa,$fb,$fc,$fd
.byte $fe,$fe,$ff,$ff,$ff,$ff
.byte $ff,$fe,$fe,$fd,$fc,$fb
.byte $fa,$f9,$f7,$f6,$f4,$f2
.byte $f0,$ee,$ec,$e9,$e7,$e4
.byte $e1,$de,$db,$d7,$d4,$d0
.byte $cd,$c9,$c5,$c1,$bd,$b9
.byte $b4,$b0,$ab,$a7,$a2,$9d
.byte $98,$93,$8e,$88,$83,$7e
.byte $78,$73,$6d,$67,$62,$5c
.byte $56,$50,$4a,$44,$3e,$38
.byte $32,$2c,$25,$1f,$19,$13
.byte $0d,$06,$00,$fa,$f3,$ed
.byte $e7,$e1,$db,$d4,$ce,$c8
.byte $c2,$bc,$b6,$b0,$aa,$a4
.byte $9e,$99,$93,$8d,$88,$82
.byte $7d,$78,$72,$6d,$68,$63
.byte $5e,$59,$55,$50,$4c,$47
.byte $43,$3f,$3b,$37,$33,$30
.byte $2c,$29,$25,$22,$1f,$1c
.byte $19,$17,$14,$12,$10,$0e
.byte $0c,$0a,$09,$07,$06,$05
.byte $04,$03,$02,$02,$01,$01
.byte $01,$01,$01,$02,$02,$03
.byte $04,$05,$06,$07,$09,$0a
.byte $0c,$0e,$10,$12,$14,$17
.byte $19,$1c,$1f,$22,$25,$29
.byte $2c,$30,$33,$37,$3b,$3f
.byte $43,$47,$4c,$50,$55,$59
.byte $5e,$63,$68,$6d,$72,$78
.byte $7d,$82,$88,$8d,$93,$99
.byte $9e,$a4,$aa,$b0,$b6,$bc
.byte $c2,$c8,$ce,$d4,$db,$e1
.byte $e7,$ed,$f3,$fa
sincoshi .byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff
numpoint = ycoords-xcoords
return sei
lda #$37
sta $01
ldx #$ff
txs
jsr $fda3
lda #$00
tay
sta $02,y
iny
bne *-4
ldx #$3c
ldy #$03
stx $b2
sty $b3
ldx #$00
ldy #$a0
jsr $fd8c
jsr $fd15
jsr $ff5b
jsr $e3bf
lda #$08
sta $ba
jmp $9000